home *** CD-ROM | disk | FTP | other *** search
- /*$T ztriangle.c GC 1.137 08/09/02 17:47:17 */
-
- /*$6
- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- */
-
- #include "ztriangle.h"
-
- float srcAlpha;
- int src_r, src_g, src_b;
- int des_r, des_g, des_b;
- int alp_r, alp_g, alp_b;
- put_pixel_t __put_pixel;
-
-
- void alphaBlend() {
- alp_b = srcAlpha * src_b + (1 - srcAlpha) * des_b;
- alp_g = srcAlpha * src_g + (1 - srcAlpha) * des_g;
- alp_r = srcAlpha * src_r + (1 - srcAlpha) * des_r;
- }
-
-
-
- /* ==============================================================
- 16 bit SMOOTH SHADING
- ==============================================================
- */
-
- void draw_init_16_sm(int *_drgbdx, int drdx, int dgdx, int dbdx, int *color, ZBufferPoint *p2,
- float *fdzdx, float *fndzdx, float *ndszdx, float *ndtzdx, PIXEL *texture,
- float *dszdx, float *dtzdx, ZBuffer *zb, int dzdx) {
- (*_drgbdx) = (SAR_RND_TO_ZERO(drdx, 6) << 22) & 0xFFC00000;
- (*_drgbdx) |= SAR_RND_TO_ZERO(dgdx, 5) & 0x000007FF;
- (*_drgbdx) |= (SAR_RND_TO_ZERO(dbdx, 7) << 12) & 0x001FF000;
- }
-
- /* */
- void put_pixel_16_sm(int _a, int *zz, PIXEL *pp, int *tmp, int *rgb, int drgbdx, int *z,
- unsigned short *pz, int dzdx, int color, PIXEL *texture, unsigned int *s,
- unsigned int *t, int dsdx, int dtdx) {
- *zz = (*z) >> ZB_POINT_Z_FRAC_BITS;
- if(ZCMP(*zz, pz[_a])) {
- *tmp = (*rgb) & 0xF81F07E0;
- pp[_a] = (*tmp) | ((*tmp) >> 16);
- pz[_a] = *zz;
- }
- (*z) += dzdx;
- *rgb = (*rgb + drgbdx) & (~0x00200800);
- }
-
- /* */
- void put_pixel_16_sm_bl(int _a, int *zz, PIXEL *pp, int *tmp, int *rgb, int drgbdx, int *z,
- unsigned short *pz, int dzdx, int color, PIXEL *texture, unsigned int *s,
- unsigned int *t, int dsdx, int dtdx) {
- int srcColor;
- *zz = (*z) >> ZB_POINT_Z_FRAC_BITS;
- if(ZCMP(*zz, pz[_a])) {
- *tmp = (*rgb) & 0xF81F07E0;
- srcColor = (*tmp) | ((*tmp) >> 16);
- PIXEL_TO_RGB(pp[_a], des_r, des_g, des_b);
- PIXEL_TO_RGB(srcColor, src_r, src_g, src_b);
- alphaBlend();
- pp[_a] = RGB_TO_PIXEL(alp_r, alp_g, alp_b);
- pz[_a] = *zz;
- }
- (*z) += dzdx;
- *rgb = (*rgb + drgbdx) & (~0x00200800);
- }
-
- /* */
- void draw_line_16_sm(int dzdx, int _drgbdx, int r1, int g1, int b1, unsigned short *pz1, PIXEL *pp1,
- int x1, int x2, int z1, float sz1, float tz1, float dszdx, float dtzdx,
- float fdzdx, float fndzdx, float ndszdx, float ndtzdx, PIXEL *texture) {
- unsigned short *pz;
- PIXEL *pp;
- unsigned int tmp, z, zz, rgb, drgbdx;
- int n;
- n = (x2 >> 16) - x1;
- pp = pp1 + x1;
- pz = pz1 + x1;
- z = z1;
- rgb = (r1 << 16) & 0xFFC00000;
- rgb |= (g1 >> 5) & 0x000007FF;
- rgb |= (b1 << 5) & 0x001FF000;
- drgbdx = _drgbdx;
- while(n >= 3) {
- __put_pixel(0, &zz, pp, &tmp, &rgb, drgbdx, &z, pz, dzdx, 0, NULL, &tmp, &tmp, tmp, tmp);
- __put_pixel(1, &zz, pp, &tmp, &rgb, drgbdx, &z, pz, dzdx, 0, NULL, &tmp, &tmp, tmp, tmp);
- __put_pixel(2, &zz, pp, &tmp, &rgb, drgbdx, &z, pz, dzdx, 0, NULL, &tmp, &tmp, tmp, tmp);
- __put_pixel(3, &zz, pp, &tmp, &rgb, drgbdx, &z, pz, dzdx, 0, NULL, &tmp, &tmp, tmp, tmp);
- pz += 4;
- pp += 4;
- n -= 4;
- }
-
- while(n >= 0) {
- __put_pixel(0, &zz, pp, &tmp, &rgb, drgbdx, &z, pz, dzdx, 0, NULL, &tmp, &tmp, tmp, tmp);
- pz++;
- pp++;
- n--;
- }
- }
-
-
-
-
- /* ==============================================================
- 16 bit FLAT SHADING
- ==============================================================
- */
-
- void draw_init_16_fl(int *_drgbdx, int drdx, int dgdx, int dbdx, int *color, ZBufferPoint *p2,
- float *fdzdx, float *fndzdx, float *ndszdx, float *ndtzdx, PIXEL *texture,
- float *dszdx, float *dtzdx, ZBuffer *zb, int dzdx) {
- *color = RGB_TO_PIXEL(p2->r, p2->g, p2->b);
- }
-
- /* */
- void put_pixel_16_fl(int _a, int *zz, PIXEL *pp, int *tmp, int *rgb, int drgbdx, int *z,
- unsigned short *pz, int dzdx, int color, PIXEL *texture, unsigned int *s,
- unsigned int *t, int dsdx, int dtdx) {
- *zz = (*z) >> ZB_POINT_Z_FRAC_BITS;
- if(ZCMP(*zz, pz[_a])) {
- pp[_a] = color;
- pz[_a] = *zz;
- }
- (*z) += dzdx;
- }
-
- /* */
- void put_pixel_16_fl_bl(int _a, int *zz, PIXEL *pp, int *tmp, int *rgb, int drgbdx, int *z,
- unsigned short *pz, int dzdx, int color, PIXEL *texture, unsigned int *s,
- unsigned int *t, int dsdx, int dtdx) {
- *zz = (*z) >> ZB_POINT_Z_FRAC_BITS;
-
- if(ZCMP(*zz, pz[_a])) {
- PIXEL_TO_RGB(pp[_a], des_r, des_g, des_b);
- alphaBlend();
- pp[_a] = RGB_TO_PIXEL(alp_r, alp_g, alp_b);
- pz[_a] = *zz;
- }
- (*z) += dzdx;
- }
-
-
-
-
- /* ==============================================================
- 16 bit TEXTURE MAPPING
- ==============================================================
- */
-
- void draw_init_16_mp(int *_drgbdx, int drdx, int dgdx, int dbdx, int *color, ZBufferPoint *p2,
- float *fdzdx, float *fndzdx, float *ndszdx, float *ndtzdx, PIXEL *texture,
- float *dszdx, float *dtzdx, ZBuffer *zb, int dzdx) {
- texture = zb->current_texture;
- *fdzdx = (float) dzdx;
- *fndzdx = NB_INTERP * (*fdzdx);
- *ndszdx = NB_INTERP * (*dszdx);
- *ndtzdx = NB_INTERP * (*dtzdx);
- }
-
- /* */
- void put_pixel_16_mp(int _a, int *zz, PIXEL *pp, int *tmp, int *rgb, int drgbdx, int *z,
- unsigned short *pz, int dzdx, int color, PIXEL *texture, unsigned int *s,
- unsigned int *t, int dsdx, int dtdx) {
- *zz = (*z) >> ZB_POINT_Z_FRAC_BITS;
- if(ZCMP(*zz, pz[_a])) {
- pp[_a] = *(PIXEL *) ((char *) texture + ((((*t) & 0x3FC00000) | ((*s) & 0x003FC000)) >> (17 - PSZSH)));
- pz[_a] = *zz;
- }
- (*z) += dzdx;
- (*s) += dsdx;
- (*t) += dtdx;
- }
-
- /* */
- void draw_line_16_mp(int dzdx, int _drgbdx, int r1, int g1, int b1, unsigned short *pz1, PIXEL *pp1,
- int x1, int x2, int z1, float sz1, float tz1, float dszdx, float dtzdx,
- float fdzdx, float fndzdx, float ndszdx, float ndtzdx, PIXEL *texture) {
- register unsigned short *pz;
- register PIXEL *pp;
- unsigned int s, t, z, zz;
- int n, dsdx, dtdx;
- float sz, tz, fz, zinv;
-
- n = (x2 >> 16) - x1;
- fz = (float) z1;
- zinv = 1.0 / fz;
- pp = (PIXEL *) ((char *) pp1 + x1 * PSZB);
- pz = pz1 + x1;
- z = z1;
- sz = sz1;
- tz = tz1;
- while(n >= (NB_INTERP - 1)) { {
- float ss, tt;
- ss = (sz * zinv);
- tt = (tz * zinv);
- s = (int) ss;
- t = (int) tt;
- dsdx = (int) ((dszdx - ss * fdzdx) * zinv);
- dtdx = (int) ((dtzdx - tt * fdzdx) * zinv);
- fz += fndzdx;
- zinv = 1.0 / fz;
- }
-
- put_pixel_16_mp(0, &zz, pp, NULL, NULL, 0, &z, pz, dzdx, 0, texture, &s, &t, dsdx, dtdx);
- put_pixel_16_mp(1, &zz, pp, NULL, NULL, 0, &z, pz, dzdx, 0, texture, &s, &t, dsdx, dtdx);
- put_pixel_16_mp(2, &zz, pp, NULL, NULL, 0, &z, pz, dzdx, 0, texture, &s, &t, dsdx, dtdx);
- put_pixel_16_mp(3, &zz, pp, NULL, NULL, 0, &z, pz, dzdx, 0, texture, &s, &t, dsdx, dtdx);
- put_pixel_16_mp(4, &zz, pp, NULL, NULL, 0, &z, pz, dzdx, 0, texture, &s, &t, dsdx, dtdx);
- put_pixel_16_mp(5, &zz, pp, NULL, NULL, 0, &z, pz, dzdx, 0, texture, &s, &t, dsdx, dtdx);
- put_pixel_16_mp(6, &zz, pp, NULL, NULL, 0, &z, pz, dzdx, 0, texture, &s, &t, dsdx, dtdx);
- put_pixel_16_mp(7, &zz, pp, NULL, NULL, 0, &z, pz, dzdx, 0, texture, &s, &t, dsdx, dtdx);
-
- pz += NB_INTERP;
- pp = (PIXEL *) ((char *) pp + NB_INTERP * PSZB);
- n -= NB_INTERP;
- sz += ndszdx;
- tz += ndtzdx;
- } {
- float ss, tt;
- ss = (sz * zinv);
- tt = (tz * zinv);
- s = (int) ss;
- t = (int) tt;
- dsdx = (int) ((dszdx - ss * fdzdx) * zinv);
- dtdx = (int) ((dtzdx - tt * fdzdx) * zinv);
- }
-
- while(n >= 0) {
- put_pixel_16_mp(0, &zz, pp, NULL, NULL, 0, &z, pz, dzdx, 0, texture, &s, &t, dsdx, dtdx);
- pz += 1;
- pp = (PIXEL *) ((char *) pp + PSZB);
- n -= 1;
- }
- }
-
-
-
-
- /* Flat shaded triangle */
- void ZB_fillTriangleFlat(ZBuffer *zb, ZBufferPoint *p0, ZBufferPoint *p1, ZBufferPoint *p2) {
- int color = 0;
-
- renderTriangle(zb, p0, p1, p2, color, 0, NULL, 0, 0, 0, 0, 1, 0, 0, 0, draw_init_16_fl,
- put_pixel_16_fl, NULL);
- }
-
- /* Flat shaded triangle with blending*/
- void ZB_fillTriangleFlatBlend(ZBuffer *zb, ZBufferPoint *p0, ZBufferPoint *p1, ZBufferPoint *p2,
- float alpha) {
- int color = 0;
- srcAlpha = alpha;
- src_r = p2->r;
- src_g = p2->g;
- src_b = p2->b;
-
- renderTriangle(zb, p0, p1, p2, color, 0, NULL, 0, 0, 0, 0, 1, 0, 0, 0, draw_init_16_fl,
- put_pixel_16_fl_bl, NULL);
- }
-
- /* Smooth filled triangle. */
- void ZB_fillTriangleSmooth(ZBuffer *zb, ZBufferPoint *p0, ZBufferPoint *p1, ZBufferPoint *p2) {
- int _drgbdx = 0;
- __put_pixel = put_pixel_16_sm;
- renderTriangle(zb, p0, p1, p2, 0, _drgbdx, NULL, 0, 0, 0, 0, 1, 1, 0, 0, draw_init_16_sm,
- put_pixel_16_sm, draw_line_16_sm);
- }
-
- /* Smooth filled triangle with blending */
- void ZB_fillTriangleSmoothBlend(ZBuffer *zb, ZBufferPoint *p0, ZBufferPoint *p1, ZBufferPoint *p2,
- float alpha) {
- int _drgbdx = 0;
- srcAlpha = alpha;
- __put_pixel = put_pixel_16_sm_bl;
- renderTriangle(zb, p0, p1, p2, 0, _drgbdx, NULL, 0, 0, 0, 0, 1, 1, 0, 0, draw_init_16_sm,
- put_pixel_16_sm_bl, draw_line_16_sm);
- }
-
- /*
- * Texture mapped triangle with perspective correction. We use the gradient method to make
- * less divisions. TODO: pipeline the division
- */
- void ZB_fillTriangleMappingPerspective(ZBuffer *zb, ZBufferPoint *p0, ZBufferPoint *p1,
- ZBufferPoint *p2) {
- PIXEL *texture = zb->current_texture;
- float fdzdx = 0, fndzdx = 0, ndszdx = 0, ndtzdx = 0;
-
- renderTriangle(zb, p0, p1, p2, 0, 0, texture, fdzdx, fndzdx, ndszdx, ndtzdx, 1, 0, 0, 1,
- draw_init_16_mp, put_pixel_16_mp, draw_line_16_mp);
- }
-
-
- void ZB_setTexture(ZBuffer *zb, PIXEL *texture) {
- zb->current_texture = texture;
- }
-